"""
@name : test.4-16
@author : smm
@projectname: python 代码
"""


# # 1、输入数字n，输出n天前的日期（time或者datatime模块
import datetime
from datetime import  datetime,timedelta
N = int(input("您想获取几天前的日期："))
nowday = datetime.now()
time = nowday - timedelta(days=N)
print(time)

# 2、输出指定文件夹下有哪些文件或文件夹（实现ls命令， os）
import os
path = r'C:\Users'
dir1 = (os.listdir(path))
for i in dir1:
    print(i)


#3.列表去重，并且从小到大排序
lis = [1,2,4,6,3,12,13,1,2,6]
list = list(set(list(lis)))
print(sorted(list))

#4、如何在一个函数内部修改全局变量
def login():
    global x
    x = 2
    print(x)
x = 10
login()

#5、如何跨模块共享全局变量
# 在单个程序中跨模块共享信息的规范方法是创建一个特殊模块（通常称为config或cfg）。
# 只需在应用程序的所有模块中导入配置模块;
# 然后该模块可用作全局名称。
# 每个模块只有一个实例，对模块对象所做的任何更改都会反映在任何地方

#6、python的基本数据类型有哪些？
#1. Numbers（数字）
#2. String（字符串）
#3. List（列表）
#4. Tuple（元组）
#5. Dictionary（字典）

#7、python中生成随机整数（1-10），随机小数（1-10），随机小数（0-1）的方法
import random
a = [random.randint(1,10)]
print(a)
b = random.uniform(1,10)
print(b)
c = random.uniform(0,1)
print(c)

#8、python中哪些是可变数据类型，哪些是不可变数据类型
# 可变数据类型：list（列表）、dict（字典）、set（集合，不常用）
# 不可变数据类型：数值类型（int、float、bool）、string（字符串）、tuple（元组）

#9、a+=1与a=a+1有什么区别
# a=a+1会在编译器报错
# short、char、byte在混合运算中会自动转为int进行运算，所以运算结果为int型，需要强转为short
# a+=1不会报错，a+=1相当于a=(short)(a+1);其中隐含了强制类型转换


#10、什么是pep8？说出5点它的标准
# 简单说就是一种编码规范，是为了让代码“更好看”，更容易被阅读。
# 1.每个 import 语句只导入一个模块，尽量避免一次导入多个模块
# 2.不要在行尾添加分号，也不要用分号将两条命令放在同一行
# 3.(建议每行不超过 80 个字符，如果超过，建议使用小括号将多行内容隐式的连接起来,
# 而不推荐使用反斜杠 \ 进行连接。)
#4.(使用必要的空行可以增加代码的可读性，通常在顶级定义（如函数或类的定义）之间空两行，
# 而方法定义之间空一行，另外在用于分隔某些功能的位置也可以空一行。)
#5.通常情况下，在运算符两侧、函数参数之间以及逗号两侧，都建议使用空格进行分隔。


#11、给定一个字符串，找出字符串第一个重复的字符
#创建一个set集合
str="anskdgad5646asjkldha"#给定字符串
chars=list(str)#将字符串转化成char类型的数组
# print(chars)
str1 = []
for i in chars:
    i = 0
    if chars[i] in str1:
        print(chars[i])
        break
    else:
        str1.append(chars[i])
    i += 1

#12、简述深拷贝与浅拷贝
#浅拷贝： 拷贝第一层数据（地址）,被拷贝地址后续进行更改，不影响前面拷贝的地址。
#深拷贝：递归拷贝所有层的数据

#13、简述python内存机制
#，Python的内存管理机制可以从三个方面来讲 （1）垃圾回收(分代处理，标志清除)
# （2）引用计数 ()（3）内存池机制(整数对象驻留区，字符串驻留区)

#14、使用python实现冒泡排序，快速排序
# 冒泡排序
a = [6,1,9,2,15,11]
num = len(a)
for n in range(0,num-1):
    is_change = False
    for m in range(0, num-1-n):
        if a[m] > a[m+1]:
            a[m], a[m+1] = a[m+1], a[m]     #相邻的两个值比较后,a[m]与a[m+1]互换位置
            is_change  = True
    if not is_change:
        break
print(a)
#
# #快速排序:
a = [6, 1, 9, 2, 15, 11]
num = len(a)
for i in range(0, num-1):
    for j in range(i+1, num):   #每次循环,拿a[i]的值跟(a[i+1]-a[num])的值依次做比较
        if a[i]<a[j]:
            a[i], a[j] = a[j], a[i]
print(a)

#15、验证一个字符串是否属于回文（从左到右，从右到左都是一样）
str = list(input("请输入字符串内容:"))
num  = len(str)
count = 0
for i in range(num):
    count += 1
    if count < num // 2:
        if str[i] != str[num - i - 1]:
            print("该字符串不是回文")
            break
    else:
        print("改字符串是回文")
        break

######  ip地址检测
import time
from datetime import datetime
import requests
def work():
        with open("weblog.txt","r+") as fp:
           #循环的一行一行的进行操作
           while True:
           # #单独的将每一行单独转换为列表

                line= fp.readline()
                str =line.split(" ")
                # 转换时间格式
                # time1 = str[3].strip("[")
                # print(time1,end=",")
                timeture = time.strftime("%Y-%m-%d %H:%M:%S", time.strptime(str[3], '[%d/%b/%Y:%H:%M:%S'))
                #将时间格式借助time。strftime包转换为需要的格式输出
                print(timeture,end=",")
                #省份，运营商
                ip = str[0]
                get_ip_info(ip)
                #带宽
                print(str[9])


#ip地址转地区、运营商
def get_ip_info(ip):
    # 借助requests.get，.json来通过ip 地址得出此ip地址的运营商跟地区
        r = requests.get(f'https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip={ip}')

        if r.json()['code'] == 0:
                i = r.json()['data']
                region = i['region']  # 地区
                isp = i['isp']  # 运营商
                print('%s,%s'%(region,isp),end=",")


work()
